1265 lines (1265 with data), 134.3 kB
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"machine_shape": "hm",
"gpuType": "V28"
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "TPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "8XnVMPBXmtRa"
},
"source": [
"# TensorNetworks in Neural Networks.\n",
"\n",
"Here, we have a small toy example of how to use a TN inside of a fully connected neural network.\n",
"\n",
"First off, let's install tensornetwork"
]
},
{
"cell_type": "code",
"metadata": {
"id": "7HGRsYNAFxME"
},
"source": [
"# !pip install tensornetwork\n",
"\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import tensorflow as tf\n",
"# Import tensornetwork\n",
"import tensornetwork as tn\n",
"import random\n",
"import time\n",
"import pandas as pd\n",
"# Set the backend to tesorflow\n",
"# (default is numpy)\n",
"tn.set_default_backend(\"tensorflow\")\n",
"np.random.seed(42)\n",
"random.seed(42)\n",
"tf.random.set_seed(42)\n",
"# Explainability code assistance aided by ChatGPT3.5\n",
"# 2021 Kelly, D. TensorFlow Explainable AI tutorial https://www.youtube.com/watch?v=6xePkn3-LME"
],
"execution_count": 35,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "g1OMCo5XmrYu"
},
"source": [
"# TensorNetwork layer definition\n",
"\n",
"Here, we define the TensorNetwork layer we wish to use to replace the fully connected layer. Here, we simply use a 2 node Matrix Product Operator network to replace the normal dense weight matrix.\n",
"\n",
"We TensorNetwork's NCon API to keep the code short."
]
},
{
"cell_type": "code",
"metadata": {
"id": "wvSMKtPufnLp"
},
"source": [
"class TNLayer(tf.keras.layers.Layer):\n",
"\n",
" def __init__(self):\n",
" super(TNLayer, self).__init__()\n",
" # Create the variables for the layer.\n",
" self.a_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
" stddev=1.0/32.0),\n",
" name=\"a\", trainable=True)\n",
" self.b_var = tf.Variable(tf.random.normal(shape=(32, 32, 2),\n",
" stddev=1.0/32.0),\n",
" name=\"b\", trainable=True)\n",
" self.bias = tf.Variable(tf.zeros(shape=(32, 32)),\n",
" name=\"bias\", trainable=True)\n",
"\n",
" def call(self, inputs):\n",
" # Define the contraction.\n",
" # We break it out so we can parallelize a batch using\n",
" # tf.vectorized_map (see below).\n",
" def f(input_vec, a_var, b_var, bias_var):\n",
" # Reshape to a matrix instead of a vector.\n",
" input_vec = tf.reshape(input_vec, (32, 32))\n",
"\n",
" # Now we create the network.\n",
" a = tn.Node(a_var)\n",
" b = tn.Node(b_var)\n",
" x_node = tn.Node(input_vec)\n",
" a[1] ^ x_node[0]\n",
" b[1] ^ x_node[1]\n",
" a[2] ^ b[2]\n",
"\n",
" # The TN should now look like this\n",
" # | |\n",
" # a --- b\n",
" # \\ /\n",
" # x\n",
"\n",
" # Now we begin the contraction.\n",
" c = a @ x_node\n",
" result = (c @ b).tensor\n",
"\n",
" # To make the code shorter, we also could've used Ncon.\n",
" # The above few lines of code is the same as this:\n",
" # result = tn.ncon([x, a_var, b_var], [[1, 2], [-1, 1, 3], [-2, 2, 3]])\n",
"\n",
" # Finally, add bias.\n",
" return result + bias_var\n",
"\n",
" # To deal with a batch of items, we can use the tf.vectorized_map\n",
" # function.\n",
" # https://www.tensorflow.org/api_docs/python/tf/vectorized_map\n",
" result = tf.vectorized_map(\n",
" lambda vec: f(vec, self.a_var, self.b_var, self.bias), inputs)\n",
" return tf.nn.relu(tf.reshape(result, (-1, 1024)))"
],
"execution_count": 36,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "V-CVqIhPnhY_"
},
"source": [
"# Smaller model\n",
"These two models are effectively the same, but notice how the TN layer has nearly 10x fewer parameters."
]
},
{
"cell_type": "code",
"metadata": {
"id": "bbKsmK8wIFTp",
"outputId": "ff9ebd9b-e09e-4a35-afb6-8d74bc85cfa3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
}
},
"source": [
"Dense = tf.keras.layers.Dense\n",
"tn_model = tf.keras.Sequential(\n",
" [\n",
" tf.keras.Input(shape=(2,)),\n",
" Dense(1024, activation=tf.nn.relu),\n",
" # Start Modified Layers\n",
" TNLayer(),\n",
" TNLayer(),\n",
" Dense(1024, activation=tf.nn.relu),\n",
" Dense(1024, activation=tf.nn.relu),\n",
" Dense(1024, activation=tf.nn.relu),\n",
" # Finish Modified Layers\n",
" Dense(1, activation=None)])\n",
"tn_model.summary()"
],
"execution_count": 37,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"sequential_3\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" dense_15 (Dense) (None, 1024) 3072 \n",
" \n",
" tn_layer_6 (TNLayer) (None, 1024) 5120 \n",
" \n",
" tn_layer_7 (TNLayer) (None, 1024) 5120 \n",
" \n",
" dense_16 (Dense) (None, 1024) 1049600 \n",
" \n",
" dense_17 (Dense) (None, 1024) 1049600 \n",
" \n",
" dense_18 (Dense) (None, 1024) 1049600 \n",
" \n",
" dense_19 (Dense) (None, 1) 1025 \n",
" \n",
"=================================================================\n",
"Total params: 3163137 (12.07 MB)\n",
"Trainable params: 3163137 (12.07 MB)\n",
"Non-trainable params: 0 (0.00 Byte)\n",
"_________________________________________________________________\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "GWwoYp0WnsLA"
},
"source": [
"# Training a model\n",
"\n",
"You can train the TN model just as you would a normal neural network model! Here, we give an example of how to do it in Keras."
]
},
{
"cell_type": "code",
"metadata": {
"id": "qDFzOC7sDBJ-"
},
"source": [
"# Generate points forming a spiral\n",
"theta = np.linspace(0, 4*np.pi, 480)\n",
"r = np.linspace(0, 1, 480)\n",
"\n",
"x = r * np.sin(theta)\n",
"y = r * np.cos(theta)\n",
"\n",
"X = np.column_stack((x, y))\n",
"Y = np.concatenate([np.ones((240)), -np.ones((240))])"
],
"execution_count": 38,
"outputs": []
},
{
"cell_type": "code",
"source": [
"seconds = time.time()\n",
"print(\"Time in seconds since beginning of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "19TWP-1eKURB",
"outputId": "00e5e496-eef5-4ddd-e6d2-9d7cb1726456"
},
"execution_count": 39,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since beginning of run: 1712723627.007121\n",
"Wed Apr 10 04:33:47 2024\n"
]
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "crc0q1vbIyTj",
"outputId": "50410031-b609-4dc5-eec5-1a831a8a1e33",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
}
},
"source": [
"tn_model.compile(optimizer=\"adam\", loss=\"mean_squared_error\")\n",
"tn_model.fit(X, Y, epochs=300, verbose=2)"
],
"execution_count": 40,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/300\n",
"15/15 - 2s - loss: 1.0033 - 2s/epoch - 111ms/step\n",
"Epoch 2/300\n",
"15/15 - 0s - loss: 1.0004 - 217ms/epoch - 14ms/step\n",
"Epoch 3/300\n",
"15/15 - 0s - loss: 1.0007 - 213ms/epoch - 14ms/step\n",
"Epoch 4/300\n",
"15/15 - 0s - loss: 0.9992 - 199ms/epoch - 13ms/step\n",
"Epoch 5/300\n",
"15/15 - 0s - loss: 0.6191 - 202ms/epoch - 13ms/step\n",
"Epoch 6/300\n",
"15/15 - 0s - loss: 0.1154 - 211ms/epoch - 14ms/step\n",
"Epoch 7/300\n",
"15/15 - 0s - loss: 0.0552 - 212ms/epoch - 14ms/step\n",
"Epoch 8/300\n",
"15/15 - 0s - loss: 0.0326 - 194ms/epoch - 13ms/step\n",
"Epoch 9/300\n",
"15/15 - 0s - loss: 0.0175 - 199ms/epoch - 13ms/step\n",
"Epoch 10/300\n",
"15/15 - 0s - loss: 0.0172 - 206ms/epoch - 14ms/step\n",
"Epoch 11/300\n",
"15/15 - 0s - loss: 0.0215 - 196ms/epoch - 13ms/step\n",
"Epoch 12/300\n",
"15/15 - 0s - loss: 0.0176 - 205ms/epoch - 14ms/step\n",
"Epoch 13/300\n",
"15/15 - 0s - loss: 0.0240 - 201ms/epoch - 13ms/step\n",
"Epoch 14/300\n",
"15/15 - 0s - loss: 0.0178 - 197ms/epoch - 13ms/step\n",
"Epoch 15/300\n",
"15/15 - 0s - loss: 0.0146 - 207ms/epoch - 14ms/step\n",
"Epoch 16/300\n",
"15/15 - 0s - loss: 0.0121 - 202ms/epoch - 13ms/step\n",
"Epoch 17/300\n",
"15/15 - 0s - loss: 0.0123 - 201ms/epoch - 13ms/step\n",
"Epoch 18/300\n",
"15/15 - 0s - loss: 0.0126 - 201ms/epoch - 13ms/step\n",
"Epoch 19/300\n",
"15/15 - 0s - loss: 0.0152 - 196ms/epoch - 13ms/step\n",
"Epoch 20/300\n",
"15/15 - 0s - loss: 0.0227 - 197ms/epoch - 13ms/step\n",
"Epoch 21/300\n",
"15/15 - 0s - loss: 0.0176 - 209ms/epoch - 14ms/step\n",
"Epoch 22/300\n",
"15/15 - 0s - loss: 0.0099 - 190ms/epoch - 13ms/step\n",
"Epoch 23/300\n",
"15/15 - 0s - loss: 0.0225 - 199ms/epoch - 13ms/step\n",
"Epoch 24/300\n",
"15/15 - 0s - loss: 0.0180 - 200ms/epoch - 13ms/step\n",
"Epoch 25/300\n",
"15/15 - 0s - loss: 0.0195 - 194ms/epoch - 13ms/step\n",
"Epoch 26/300\n",
"15/15 - 0s - loss: 0.0131 - 200ms/epoch - 13ms/step\n",
"Epoch 27/300\n",
"15/15 - 0s - loss: 0.0367 - 192ms/epoch - 13ms/step\n",
"Epoch 28/300\n",
"15/15 - 0s - loss: 0.0136 - 202ms/epoch - 13ms/step\n",
"Epoch 29/300\n",
"15/15 - 0s - loss: 0.0299 - 209ms/epoch - 14ms/step\n",
"Epoch 30/300\n",
"15/15 - 0s - loss: 0.0313 - 205ms/epoch - 14ms/step\n",
"Epoch 31/300\n",
"15/15 - 0s - loss: 0.0113 - 204ms/epoch - 14ms/step\n",
"Epoch 32/300\n",
"15/15 - 0s - loss: 0.0103 - 191ms/epoch - 13ms/step\n",
"Epoch 33/300\n",
"15/15 - 0s - loss: 0.0096 - 203ms/epoch - 14ms/step\n",
"Epoch 34/300\n",
"15/15 - 0s - loss: 0.0111 - 196ms/epoch - 13ms/step\n",
"Epoch 35/300\n",
"15/15 - 0s - loss: 0.0064 - 198ms/epoch - 13ms/step\n",
"Epoch 36/300\n",
"15/15 - 0s - loss: 0.0083 - 195ms/epoch - 13ms/step\n",
"Epoch 37/300\n",
"15/15 - 0s - loss: 0.0168 - 202ms/epoch - 13ms/step\n",
"Epoch 38/300\n",
"15/15 - 0s - loss: 0.0183 - 209ms/epoch - 14ms/step\n",
"Epoch 39/300\n",
"15/15 - 0s - loss: 0.0090 - 200ms/epoch - 13ms/step\n",
"Epoch 40/300\n",
"15/15 - 0s - loss: 0.0056 - 206ms/epoch - 14ms/step\n",
"Epoch 41/300\n",
"15/15 - 0s - loss: 0.0139 - 196ms/epoch - 13ms/step\n",
"Epoch 42/300\n",
"15/15 - 0s - loss: 0.0067 - 197ms/epoch - 13ms/step\n",
"Epoch 43/300\n",
"15/15 - 0s - loss: 0.0026 - 204ms/epoch - 14ms/step\n",
"Epoch 44/300\n",
"15/15 - 0s - loss: 0.0094 - 200ms/epoch - 13ms/step\n",
"Epoch 45/300\n",
"15/15 - 0s - loss: 0.0055 - 196ms/epoch - 13ms/step\n",
"Epoch 46/300\n",
"15/15 - 0s - loss: 0.0064 - 196ms/epoch - 13ms/step\n",
"Epoch 47/300\n",
"15/15 - 0s - loss: 0.0093 - 191ms/epoch - 13ms/step\n",
"Epoch 48/300\n",
"15/15 - 0s - loss: 0.0049 - 199ms/epoch - 13ms/step\n",
"Epoch 49/300\n",
"15/15 - 0s - loss: 0.0102 - 194ms/epoch - 13ms/step\n",
"Epoch 50/300\n",
"15/15 - 0s - loss: 0.0062 - 203ms/epoch - 14ms/step\n",
"Epoch 51/300\n",
"15/15 - 0s - loss: 0.0254 - 197ms/epoch - 13ms/step\n",
"Epoch 52/300\n",
"15/15 - 0s - loss: 0.0161 - 195ms/epoch - 13ms/step\n",
"Epoch 53/300\n",
"15/15 - 0s - loss: 0.0039 - 191ms/epoch - 13ms/step\n",
"Epoch 54/300\n",
"15/15 - 0s - loss: 0.0059 - 194ms/epoch - 13ms/step\n",
"Epoch 55/300\n",
"15/15 - 0s - loss: 0.0068 - 190ms/epoch - 13ms/step\n",
"Epoch 56/300\n",
"15/15 - 0s - loss: 0.0087 - 204ms/epoch - 14ms/step\n",
"Epoch 57/300\n",
"15/15 - 0s - loss: 0.0169 - 196ms/epoch - 13ms/step\n",
"Epoch 58/300\n",
"15/15 - 0s - loss: 0.0090 - 197ms/epoch - 13ms/step\n",
"Epoch 59/300\n",
"15/15 - 0s - loss: 0.0062 - 203ms/epoch - 14ms/step\n",
"Epoch 60/300\n",
"15/15 - 0s - loss: 0.0103 - 188ms/epoch - 13ms/step\n",
"Epoch 61/300\n",
"15/15 - 0s - loss: 0.0076 - 193ms/epoch - 13ms/step\n",
"Epoch 62/300\n",
"15/15 - 0s - loss: 0.0077 - 190ms/epoch - 13ms/step\n",
"Epoch 63/300\n",
"15/15 - 0s - loss: 0.0046 - 197ms/epoch - 13ms/step\n",
"Epoch 64/300\n",
"15/15 - 0s - loss: 0.0093 - 194ms/epoch - 13ms/step\n",
"Epoch 65/300\n",
"15/15 - 0s - loss: 0.0107 - 191ms/epoch - 13ms/step\n",
"Epoch 66/300\n",
"15/15 - 0s - loss: 0.0042 - 193ms/epoch - 13ms/step\n",
"Epoch 67/300\n",
"15/15 - 0s - loss: 0.0050 - 194ms/epoch - 13ms/step\n",
"Epoch 68/300\n",
"15/15 - 0s - loss: 0.0069 - 188ms/epoch - 13ms/step\n",
"Epoch 69/300\n",
"15/15 - 0s - loss: 0.0036 - 204ms/epoch - 14ms/step\n",
"Epoch 70/300\n",
"15/15 - 0s - loss: 0.0050 - 191ms/epoch - 13ms/step\n",
"Epoch 71/300\n",
"15/15 - 0s - loss: 0.0091 - 197ms/epoch - 13ms/step\n",
"Epoch 72/300\n",
"15/15 - 0s - loss: 0.0072 - 198ms/epoch - 13ms/step\n",
"Epoch 73/300\n",
"15/15 - 0s - loss: 0.0093 - 215ms/epoch - 14ms/step\n",
"Epoch 74/300\n",
"15/15 - 0s - loss: 0.0073 - 200ms/epoch - 13ms/step\n",
"Epoch 75/300\n",
"15/15 - 0s - loss: 0.0022 - 201ms/epoch - 13ms/step\n",
"Epoch 76/300\n",
"15/15 - 0s - loss: 0.0062 - 194ms/epoch - 13ms/step\n",
"Epoch 77/300\n",
"15/15 - 0s - loss: 0.0028 - 195ms/epoch - 13ms/step\n",
"Epoch 78/300\n",
"15/15 - 0s - loss: 0.0128 - 204ms/epoch - 14ms/step\n",
"Epoch 79/300\n",
"15/15 - 0s - loss: 0.0060 - 199ms/epoch - 13ms/step\n",
"Epoch 80/300\n",
"15/15 - 0s - loss: 0.0118 - 207ms/epoch - 14ms/step\n",
"Epoch 81/300\n",
"15/15 - 0s - loss: 0.0100 - 202ms/epoch - 13ms/step\n",
"Epoch 82/300\n",
"15/15 - 0s - loss: 0.0076 - 196ms/epoch - 13ms/step\n",
"Epoch 83/300\n",
"15/15 - 0s - loss: 0.0110 - 205ms/epoch - 14ms/step\n",
"Epoch 84/300\n",
"15/15 - 0s - loss: 0.0063 - 193ms/epoch - 13ms/step\n",
"Epoch 85/300\n",
"15/15 - 0s - loss: 0.0088 - 198ms/epoch - 13ms/step\n",
"Epoch 86/300\n",
"15/15 - 0s - loss: 0.0021 - 197ms/epoch - 13ms/step\n",
"Epoch 87/300\n",
"15/15 - 0s - loss: 0.0092 - 193ms/epoch - 13ms/step\n",
"Epoch 88/300\n",
"15/15 - 0s - loss: 0.0111 - 195ms/epoch - 13ms/step\n",
"Epoch 89/300\n",
"15/15 - 0s - loss: 0.0057 - 204ms/epoch - 14ms/step\n",
"Epoch 90/300\n",
"15/15 - 0s - loss: 0.0075 - 193ms/epoch - 13ms/step\n",
"Epoch 91/300\n",
"15/15 - 0s - loss: 0.0135 - 199ms/epoch - 13ms/step\n",
"Epoch 92/300\n",
"15/15 - 0s - loss: 0.0046 - 193ms/epoch - 13ms/step\n",
"Epoch 93/300\n",
"15/15 - 0s - loss: 0.0032 - 196ms/epoch - 13ms/step\n",
"Epoch 94/300\n",
"15/15 - 0s - loss: 0.0054 - 190ms/epoch - 13ms/step\n",
"Epoch 95/300\n",
"15/15 - 0s - loss: 0.0108 - 188ms/epoch - 13ms/step\n",
"Epoch 96/300\n",
"15/15 - 0s - loss: 0.0043 - 192ms/epoch - 13ms/step\n",
"Epoch 97/300\n",
"15/15 - 0s - loss: 0.0032 - 194ms/epoch - 13ms/step\n",
"Epoch 98/300\n",
"15/15 - 0s - loss: 0.0044 - 195ms/epoch - 13ms/step\n",
"Epoch 99/300\n",
"15/15 - 0s - loss: 0.0089 - 198ms/epoch - 13ms/step\n",
"Epoch 100/300\n",
"15/15 - 0s - loss: 0.0110 - 208ms/epoch - 14ms/step\n",
"Epoch 101/300\n",
"15/15 - 0s - loss: 0.0049 - 195ms/epoch - 13ms/step\n",
"Epoch 102/300\n",
"15/15 - 0s - loss: 0.0088 - 197ms/epoch - 13ms/step\n",
"Epoch 103/300\n",
"15/15 - 0s - loss: 0.0165 - 200ms/epoch - 13ms/step\n",
"Epoch 104/300\n",
"15/15 - 0s - loss: 0.0026 - 197ms/epoch - 13ms/step\n",
"Epoch 105/300\n",
"15/15 - 0s - loss: 0.0028 - 200ms/epoch - 13ms/step\n",
"Epoch 106/300\n",
"15/15 - 0s - loss: 0.0036 - 189ms/epoch - 13ms/step\n",
"Epoch 107/300\n",
"15/15 - 0s - loss: 0.0073 - 194ms/epoch - 13ms/step\n",
"Epoch 108/300\n",
"15/15 - 0s - loss: 0.0067 - 197ms/epoch - 13ms/step\n",
"Epoch 109/300\n",
"15/15 - 0s - loss: 0.0051 - 213ms/epoch - 14ms/step\n",
"Epoch 110/300\n",
"15/15 - 0s - loss: 0.0038 - 199ms/epoch - 13ms/step\n",
"Epoch 111/300\n",
"15/15 - 0s - loss: 0.0098 - 191ms/epoch - 13ms/step\n",
"Epoch 112/300\n",
"15/15 - 0s - loss: 0.0054 - 191ms/epoch - 13ms/step\n",
"Epoch 113/300\n",
"15/15 - 0s - loss: 0.0060 - 192ms/epoch - 13ms/step\n",
"Epoch 114/300\n",
"15/15 - 0s - loss: 0.0022 - 198ms/epoch - 13ms/step\n",
"Epoch 115/300\n",
"15/15 - 0s - loss: 0.0035 - 195ms/epoch - 13ms/step\n",
"Epoch 116/300\n",
"15/15 - 0s - loss: 0.0070 - 201ms/epoch - 13ms/step\n",
"Epoch 117/300\n",
"15/15 - 0s - loss: 0.0074 - 192ms/epoch - 13ms/step\n",
"Epoch 118/300\n",
"15/15 - 0s - loss: 0.0075 - 198ms/epoch - 13ms/step\n",
"Epoch 119/300\n",
"15/15 - 0s - loss: 0.0084 - 198ms/epoch - 13ms/step\n",
"Epoch 120/300\n",
"15/15 - 0s - loss: 0.0101 - 192ms/epoch - 13ms/step\n",
"Epoch 121/300\n",
"15/15 - 0s - loss: 0.0088 - 192ms/epoch - 13ms/step\n",
"Epoch 122/300\n",
"15/15 - 0s - loss: 0.0134 - 195ms/epoch - 13ms/step\n",
"Epoch 123/300\n",
"15/15 - 0s - loss: 0.0117 - 191ms/epoch - 13ms/step\n",
"Epoch 124/300\n",
"15/15 - 0s - loss: 0.0037 - 189ms/epoch - 13ms/step\n",
"Epoch 125/300\n",
"15/15 - 0s - loss: 0.0035 - 194ms/epoch - 13ms/step\n",
"Epoch 126/300\n",
"15/15 - 0s - loss: 0.0030 - 192ms/epoch - 13ms/step\n",
"Epoch 127/300\n",
"15/15 - 0s - loss: 0.0084 - 189ms/epoch - 13ms/step\n",
"Epoch 128/300\n",
"15/15 - 0s - loss: 0.0067 - 201ms/epoch - 13ms/step\n",
"Epoch 129/300\n",
"15/15 - 0s - loss: 0.0057 - 194ms/epoch - 13ms/step\n",
"Epoch 130/300\n",
"15/15 - 0s - loss: 0.0065 - 201ms/epoch - 13ms/step\n",
"Epoch 131/300\n",
"15/15 - 0s - loss: 0.0036 - 192ms/epoch - 13ms/step\n",
"Epoch 132/300\n",
"15/15 - 0s - loss: 0.0044 - 197ms/epoch - 13ms/step\n",
"Epoch 133/300\n",
"15/15 - 0s - loss: 0.0031 - 199ms/epoch - 13ms/step\n",
"Epoch 134/300\n",
"15/15 - 0s - loss: 0.0028 - 201ms/epoch - 13ms/step\n",
"Epoch 135/300\n",
"15/15 - 0s - loss: 0.0031 - 196ms/epoch - 13ms/step\n",
"Epoch 136/300\n",
"15/15 - 0s - loss: 0.0055 - 189ms/epoch - 13ms/step\n",
"Epoch 137/300\n",
"15/15 - 0s - loss: 0.0092 - 189ms/epoch - 13ms/step\n",
"Epoch 138/300\n",
"15/15 - 0s - loss: 0.0029 - 188ms/epoch - 13ms/step\n",
"Epoch 139/300\n",
"15/15 - 0s - loss: 0.0034 - 198ms/epoch - 13ms/step\n",
"Epoch 140/300\n",
"15/15 - 0s - loss: 0.0029 - 201ms/epoch - 13ms/step\n",
"Epoch 141/300\n",
"15/15 - 0s - loss: 0.0077 - 191ms/epoch - 13ms/step\n",
"Epoch 142/300\n",
"15/15 - 0s - loss: 0.0105 - 188ms/epoch - 13ms/step\n",
"Epoch 143/300\n",
"15/15 - 0s - loss: 0.0034 - 204ms/epoch - 14ms/step\n",
"Epoch 144/300\n",
"15/15 - 0s - loss: 0.0041 - 203ms/epoch - 14ms/step\n",
"Epoch 145/300\n",
"15/15 - 0s - loss: 0.0036 - 204ms/epoch - 14ms/step\n",
"Epoch 146/300\n",
"15/15 - 0s - loss: 0.0044 - 196ms/epoch - 13ms/step\n",
"Epoch 147/300\n",
"15/15 - 0s - loss: 0.0056 - 199ms/epoch - 13ms/step\n",
"Epoch 148/300\n",
"15/15 - 0s - loss: 0.0119 - 199ms/epoch - 13ms/step\n",
"Epoch 149/300\n",
"15/15 - 0s - loss: 0.0142 - 197ms/epoch - 13ms/step\n",
"Epoch 150/300\n",
"15/15 - 0s - loss: 0.0081 - 210ms/epoch - 14ms/step\n",
"Epoch 151/300\n",
"15/15 - 0s - loss: 0.0048 - 201ms/epoch - 13ms/step\n",
"Epoch 152/300\n",
"15/15 - 0s - loss: 0.0038 - 191ms/epoch - 13ms/step\n",
"Epoch 153/300\n",
"15/15 - 0s - loss: 0.0037 - 195ms/epoch - 13ms/step\n",
"Epoch 154/300\n",
"15/15 - 0s - loss: 0.0029 - 198ms/epoch - 13ms/step\n",
"Epoch 155/300\n",
"15/15 - 0s - loss: 0.0022 - 208ms/epoch - 14ms/step\n",
"Epoch 156/300\n",
"15/15 - 0s - loss: 0.0038 - 196ms/epoch - 13ms/step\n",
"Epoch 157/300\n",
"15/15 - 0s - loss: 0.0038 - 201ms/epoch - 13ms/step\n",
"Epoch 158/300\n",
"15/15 - 0s - loss: 0.0037 - 198ms/epoch - 13ms/step\n",
"Epoch 159/300\n",
"15/15 - 0s - loss: 0.0019 - 202ms/epoch - 13ms/step\n",
"Epoch 160/300\n",
"15/15 - 0s - loss: 0.0036 - 195ms/epoch - 13ms/step\n",
"Epoch 161/300\n",
"15/15 - 0s - loss: 0.0045 - 199ms/epoch - 13ms/step\n",
"Epoch 162/300\n",
"15/15 - 0s - loss: 0.0116 - 211ms/epoch - 14ms/step\n",
"Epoch 163/300\n",
"15/15 - 0s - loss: 0.0103 - 206ms/epoch - 14ms/step\n",
"Epoch 164/300\n",
"15/15 - 0s - loss: 0.0107 - 209ms/epoch - 14ms/step\n",
"Epoch 165/300\n",
"15/15 - 0s - loss: 0.0033 - 203ms/epoch - 14ms/step\n",
"Epoch 166/300\n",
"15/15 - 0s - loss: 0.0044 - 202ms/epoch - 13ms/step\n",
"Epoch 167/300\n",
"15/15 - 0s - loss: 0.0088 - 202ms/epoch - 13ms/step\n",
"Epoch 168/300\n",
"15/15 - 0s - loss: 0.0040 - 199ms/epoch - 13ms/step\n",
"Epoch 169/300\n",
"15/15 - 0s - loss: 0.0048 - 197ms/epoch - 13ms/step\n",
"Epoch 170/300\n",
"15/15 - 0s - loss: 0.0030 - 200ms/epoch - 13ms/step\n",
"Epoch 171/300\n",
"15/15 - 0s - loss: 0.0051 - 193ms/epoch - 13ms/step\n",
"Epoch 172/300\n",
"15/15 - 0s - loss: 0.0166 - 197ms/epoch - 13ms/step\n",
"Epoch 173/300\n",
"15/15 - 0s - loss: 0.0017 - 197ms/epoch - 13ms/step\n",
"Epoch 174/300\n",
"15/15 - 0s - loss: 0.0083 - 198ms/epoch - 13ms/step\n",
"Epoch 175/300\n",
"15/15 - 0s - loss: 0.0040 - 193ms/epoch - 13ms/step\n",
"Epoch 176/300\n",
"15/15 - 0s - loss: 0.0082 - 201ms/epoch - 13ms/step\n",
"Epoch 177/300\n",
"15/15 - 0s - loss: 0.0021 - 200ms/epoch - 13ms/step\n",
"Epoch 178/300\n",
"15/15 - 0s - loss: 0.0017 - 200ms/epoch - 13ms/step\n",
"Epoch 179/300\n",
"15/15 - 0s - loss: 0.0019 - 208ms/epoch - 14ms/step\n",
"Epoch 180/300\n",
"15/15 - 0s - loss: 0.0037 - 201ms/epoch - 13ms/step\n",
"Epoch 181/300\n",
"15/15 - 0s - loss: 0.0030 - 201ms/epoch - 13ms/step\n",
"Epoch 182/300\n",
"15/15 - 0s - loss: 0.0110 - 202ms/epoch - 13ms/step\n",
"Epoch 183/300\n",
"15/15 - 0s - loss: 0.0033 - 201ms/epoch - 13ms/step\n",
"Epoch 184/300\n",
"15/15 - 0s - loss: 0.0028 - 203ms/epoch - 14ms/step\n",
"Epoch 185/300\n",
"15/15 - 0s - loss: 0.0034 - 197ms/epoch - 13ms/step\n",
"Epoch 186/300\n",
"15/15 - 0s - loss: 0.0054 - 203ms/epoch - 14ms/step\n",
"Epoch 187/300\n",
"15/15 - 0s - loss: 0.0132 - 194ms/epoch - 13ms/step\n",
"Epoch 188/300\n",
"15/15 - 0s - loss: 0.0035 - 199ms/epoch - 13ms/step\n",
"Epoch 189/300\n",
"15/15 - 0s - loss: 0.0050 - 207ms/epoch - 14ms/step\n",
"Epoch 190/300\n",
"15/15 - 0s - loss: 0.0120 - 202ms/epoch - 13ms/step\n",
"Epoch 191/300\n",
"15/15 - 0s - loss: 0.0053 - 203ms/epoch - 14ms/step\n",
"Epoch 192/300\n",
"15/15 - 0s - loss: 0.0031 - 199ms/epoch - 13ms/step\n",
"Epoch 193/300\n",
"15/15 - 0s - loss: 0.0039 - 206ms/epoch - 14ms/step\n",
"Epoch 194/300\n",
"15/15 - 0s - loss: 0.0165 - 204ms/epoch - 14ms/step\n",
"Epoch 195/300\n",
"15/15 - 0s - loss: 0.0128 - 198ms/epoch - 13ms/step\n",
"Epoch 196/300\n",
"15/15 - 0s - loss: 0.0038 - 203ms/epoch - 14ms/step\n",
"Epoch 197/300\n",
"15/15 - 0s - loss: 0.0048 - 205ms/epoch - 14ms/step\n",
"Epoch 198/300\n",
"15/15 - 0s - loss: 0.0066 - 199ms/epoch - 13ms/step\n",
"Epoch 199/300\n",
"15/15 - 0s - loss: 0.0072 - 209ms/epoch - 14ms/step\n",
"Epoch 200/300\n",
"15/15 - 0s - loss: 0.0084 - 199ms/epoch - 13ms/step\n",
"Epoch 201/300\n",
"15/15 - 0s - loss: 0.0032 - 200ms/epoch - 13ms/step\n",
"Epoch 202/300\n",
"15/15 - 0s - loss: 0.0089 - 193ms/epoch - 13ms/step\n",
"Epoch 203/300\n",
"15/15 - 0s - loss: 0.0037 - 203ms/epoch - 14ms/step\n",
"Epoch 204/300\n",
"15/15 - 0s - loss: 0.0045 - 198ms/epoch - 13ms/step\n",
"Epoch 205/300\n",
"15/15 - 0s - loss: 0.0034 - 196ms/epoch - 13ms/step\n",
"Epoch 206/300\n",
"15/15 - 0s - loss: 0.0023 - 192ms/epoch - 13ms/step\n",
"Epoch 207/300\n",
"15/15 - 0s - loss: 0.0023 - 200ms/epoch - 13ms/step\n",
"Epoch 208/300\n",
"15/15 - 0s - loss: 6.7907e-04 - 198ms/epoch - 13ms/step\n",
"Epoch 209/300\n",
"15/15 - 0s - loss: 0.0017 - 203ms/epoch - 14ms/step\n",
"Epoch 210/300\n",
"15/15 - 0s - loss: 0.0084 - 203ms/epoch - 14ms/step\n",
"Epoch 211/300\n",
"15/15 - 0s - loss: 0.0088 - 201ms/epoch - 13ms/step\n",
"Epoch 212/300\n",
"15/15 - 0s - loss: 0.0164 - 205ms/epoch - 14ms/step\n",
"Epoch 213/300\n",
"15/15 - 0s - loss: 0.0111 - 199ms/epoch - 13ms/step\n",
"Epoch 214/300\n",
"15/15 - 0s - loss: 0.0112 - 193ms/epoch - 13ms/step\n",
"Epoch 215/300\n",
"15/15 - 0s - loss: 0.0132 - 191ms/epoch - 13ms/step\n",
"Epoch 216/300\n",
"15/15 - 0s - loss: 0.0169 - 189ms/epoch - 13ms/step\n",
"Epoch 217/300\n",
"15/15 - 0s - loss: 0.0104 - 189ms/epoch - 13ms/step\n",
"Epoch 218/300\n",
"15/15 - 0s - loss: 0.0093 - 199ms/epoch - 13ms/step\n",
"Epoch 219/300\n",
"15/15 - 0s - loss: 0.0015 - 205ms/epoch - 14ms/step\n",
"Epoch 220/300\n",
"15/15 - 0s - loss: 0.0056 - 195ms/epoch - 13ms/step\n",
"Epoch 221/300\n",
"15/15 - 0s - loss: 0.0076 - 198ms/epoch - 13ms/step\n",
"Epoch 222/300\n",
"15/15 - 0s - loss: 0.0024 - 198ms/epoch - 13ms/step\n",
"Epoch 223/300\n",
"15/15 - 0s - loss: 0.0030 - 200ms/epoch - 13ms/step\n",
"Epoch 224/300\n",
"15/15 - 0s - loss: 0.0059 - 195ms/epoch - 13ms/step\n",
"Epoch 225/300\n",
"15/15 - 0s - loss: 0.0022 - 189ms/epoch - 13ms/step\n",
"Epoch 226/300\n",
"15/15 - 0s - loss: 0.0016 - 201ms/epoch - 13ms/step\n",
"Epoch 227/300\n",
"15/15 - 0s - loss: 0.0047 - 191ms/epoch - 13ms/step\n",
"Epoch 228/300\n",
"15/15 - 0s - loss: 0.0099 - 192ms/epoch - 13ms/step\n",
"Epoch 229/300\n",
"15/15 - 0s - loss: 0.0051 - 202ms/epoch - 13ms/step\n",
"Epoch 230/300\n",
"15/15 - 0s - loss: 0.0022 - 188ms/epoch - 13ms/step\n",
"Epoch 231/300\n",
"15/15 - 0s - loss: 0.0031 - 200ms/epoch - 13ms/step\n",
"Epoch 232/300\n",
"15/15 - 0s - loss: 0.0015 - 196ms/epoch - 13ms/step\n",
"Epoch 233/300\n",
"15/15 - 0s - loss: 0.0039 - 190ms/epoch - 13ms/step\n",
"Epoch 234/300\n",
"15/15 - 0s - loss: 0.0039 - 195ms/epoch - 13ms/step\n",
"Epoch 235/300\n",
"15/15 - 0s - loss: 0.0047 - 190ms/epoch - 13ms/step\n",
"Epoch 236/300\n",
"15/15 - 0s - loss: 0.0091 - 196ms/epoch - 13ms/step\n",
"Epoch 237/300\n",
"15/15 - 0s - loss: 0.0064 - 197ms/epoch - 13ms/step\n",
"Epoch 238/300\n",
"15/15 - 0s - loss: 9.3840e-04 - 190ms/epoch - 13ms/step\n",
"Epoch 239/300\n",
"15/15 - 0s - loss: 0.0167 - 200ms/epoch - 13ms/step\n",
"Epoch 240/300\n",
"15/15 - 0s - loss: 0.0051 - 197ms/epoch - 13ms/step\n",
"Epoch 241/300\n",
"15/15 - 0s - loss: 0.0052 - 191ms/epoch - 13ms/step\n",
"Epoch 242/300\n",
"15/15 - 0s - loss: 0.0025 - 190ms/epoch - 13ms/step\n",
"Epoch 243/300\n",
"15/15 - 0s - loss: 0.0048 - 191ms/epoch - 13ms/step\n",
"Epoch 244/300\n",
"15/15 - 0s - loss: 0.0040 - 194ms/epoch - 13ms/step\n",
"Epoch 245/300\n",
"15/15 - 0s - loss: 0.0040 - 191ms/epoch - 13ms/step\n",
"Epoch 246/300\n",
"15/15 - 0s - loss: 0.0022 - 188ms/epoch - 13ms/step\n",
"Epoch 247/300\n",
"15/15 - 0s - loss: 0.0044 - 195ms/epoch - 13ms/step\n",
"Epoch 248/300\n",
"15/15 - 0s - loss: 0.0036 - 189ms/epoch - 13ms/step\n",
"Epoch 249/300\n",
"15/15 - 0s - loss: 0.0027 - 193ms/epoch - 13ms/step\n",
"Epoch 250/300\n",
"15/15 - 0s - loss: 0.0023 - 197ms/epoch - 13ms/step\n",
"Epoch 251/300\n",
"15/15 - 0s - loss: 0.0013 - 192ms/epoch - 13ms/step\n",
"Epoch 252/300\n",
"15/15 - 0s - loss: 0.0016 - 189ms/epoch - 13ms/step\n",
"Epoch 253/300\n",
"15/15 - 0s - loss: 0.0031 - 202ms/epoch - 13ms/step\n",
"Epoch 254/300\n",
"15/15 - 0s - loss: 4.5726e-04 - 188ms/epoch - 13ms/step\n",
"Epoch 255/300\n",
"15/15 - 0s - loss: 5.3492e-04 - 190ms/epoch - 13ms/step\n",
"Epoch 256/300\n",
"15/15 - 0s - loss: 3.4414e-04 - 194ms/epoch - 13ms/step\n",
"Epoch 257/300\n",
"15/15 - 0s - loss: 4.6351e-04 - 192ms/epoch - 13ms/step\n",
"Epoch 258/300\n",
"15/15 - 0s - loss: 3.5096e-04 - 195ms/epoch - 13ms/step\n",
"Epoch 259/300\n",
"15/15 - 0s - loss: 8.8967e-04 - 194ms/epoch - 13ms/step\n",
"Epoch 260/300\n",
"15/15 - 0s - loss: 0.0091 - 199ms/epoch - 13ms/step\n",
"Epoch 261/300\n",
"15/15 - 0s - loss: 0.0100 - 204ms/epoch - 14ms/step\n",
"Epoch 262/300\n",
"15/15 - 0s - loss: 7.5330e-04 - 195ms/epoch - 13ms/step\n",
"Epoch 263/300\n",
"15/15 - 0s - loss: 5.1926e-04 - 190ms/epoch - 13ms/step\n",
"Epoch 264/300\n",
"15/15 - 0s - loss: 2.5240e-04 - 190ms/epoch - 13ms/step\n",
"Epoch 265/300\n",
"15/15 - 0s - loss: 1.8170e-04 - 192ms/epoch - 13ms/step\n",
"Epoch 266/300\n",
"15/15 - 0s - loss: 1.5298e-04 - 194ms/epoch - 13ms/step\n",
"Epoch 267/300\n",
"15/15 - 0s - loss: 1.8981e-04 - 191ms/epoch - 13ms/step\n",
"Epoch 268/300\n",
"15/15 - 0s - loss: 2.8797e-04 - 190ms/epoch - 13ms/step\n",
"Epoch 269/300\n",
"15/15 - 0s - loss: 6.7136e-04 - 196ms/epoch - 13ms/step\n",
"Epoch 270/300\n",
"15/15 - 0s - loss: 0.0012 - 196ms/epoch - 13ms/step\n",
"Epoch 271/300\n",
"15/15 - 0s - loss: 6.4091e-04 - 189ms/epoch - 13ms/step\n",
"Epoch 272/300\n",
"15/15 - 0s - loss: 4.0468e-04 - 197ms/epoch - 13ms/step\n",
"Epoch 273/300\n",
"15/15 - 0s - loss: 1.4049e-04 - 198ms/epoch - 13ms/step\n",
"Epoch 274/300\n",
"15/15 - 0s - loss: 1.2574e-04 - 195ms/epoch - 13ms/step\n",
"Epoch 275/300\n",
"15/15 - 0s - loss: 1.3728e-04 - 193ms/epoch - 13ms/step\n",
"Epoch 276/300\n",
"15/15 - 0s - loss: 1.2202e-04 - 189ms/epoch - 13ms/step\n",
"Epoch 277/300\n",
"15/15 - 0s - loss: 9.9591e-05 - 190ms/epoch - 13ms/step\n",
"Epoch 278/300\n",
"15/15 - 0s - loss: 7.3681e-05 - 191ms/epoch - 13ms/step\n",
"Epoch 279/300\n",
"15/15 - 0s - loss: 1.2341e-04 - 193ms/epoch - 13ms/step\n",
"Epoch 280/300\n",
"15/15 - 0s - loss: 1.1865e-04 - 196ms/epoch - 13ms/step\n",
"Epoch 281/300\n",
"15/15 - 0s - loss: 8.0794e-05 - 201ms/epoch - 13ms/step\n",
"Epoch 282/300\n",
"15/15 - 0s - loss: 4.2742e-05 - 196ms/epoch - 13ms/step\n",
"Epoch 283/300\n",
"15/15 - 0s - loss: 3.8876e-05 - 190ms/epoch - 13ms/step\n",
"Epoch 284/300\n",
"15/15 - 0s - loss: 6.4258e-05 - 198ms/epoch - 13ms/step\n",
"Epoch 285/300\n",
"15/15 - 0s - loss: 2.8882e-05 - 193ms/epoch - 13ms/step\n",
"Epoch 286/300\n",
"15/15 - 0s - loss: 2.2556e-05 - 199ms/epoch - 13ms/step\n",
"Epoch 287/300\n",
"15/15 - 0s - loss: 1.8510e-05 - 191ms/epoch - 13ms/step\n",
"Epoch 288/300\n",
"15/15 - 0s - loss: 2.2595e-05 - 195ms/epoch - 13ms/step\n",
"Epoch 289/300\n",
"15/15 - 0s - loss: 1.8535e-05 - 194ms/epoch - 13ms/step\n",
"Epoch 290/300\n",
"15/15 - 0s - loss: 1.5748e-05 - 199ms/epoch - 13ms/step\n",
"Epoch 291/300\n",
"15/15 - 0s - loss: 1.4454e-05 - 203ms/epoch - 14ms/step\n",
"Epoch 292/300\n",
"15/15 - 0s - loss: 1.3671e-05 - 192ms/epoch - 13ms/step\n",
"Epoch 293/300\n",
"15/15 - 0s - loss: 1.3364e-05 - 195ms/epoch - 13ms/step\n",
"Epoch 294/300\n",
"15/15 - 0s - loss: 9.8679e-06 - 198ms/epoch - 13ms/step\n",
"Epoch 295/300\n",
"15/15 - 0s - loss: 1.2155e-05 - 196ms/epoch - 13ms/step\n",
"Epoch 296/300\n",
"15/15 - 0s - loss: 1.0995e-05 - 190ms/epoch - 13ms/step\n",
"Epoch 297/300\n",
"15/15 - 0s - loss: 9.6962e-06 - 195ms/epoch - 13ms/step\n",
"Epoch 298/300\n",
"15/15 - 0s - loss: 6.3400e-06 - 193ms/epoch - 13ms/step\n",
"Epoch 299/300\n",
"15/15 - 0s - loss: 5.9485e-06 - 197ms/epoch - 13ms/step\n",
"Epoch 300/300\n",
"15/15 - 0s - loss: 1.0501e-05 - 201ms/epoch - 13ms/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<keras.src.callbacks.History at 0x7fa5103a3340>"
]
},
"metadata": {},
"execution_count": 40
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "n-aNP4n3sqG_",
"outputId": "49d051e8-a6cc-4a72-f66e-5ee349ec44c7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 443
}
},
"source": [
"# Plotting code, feel free to ignore.\n",
"h = 1.0\n",
"x_min, x_max = X[:, 0].min() - 5, X[:, 0].max() + 5\n",
"y_min, y_max = X[:, 1].min() - 5, X[:, 1].max() + 5\n",
"xx, yy = np.meshgrid(np.arange(x_min, x_max, h),\n",
" np.arange(y_min, y_max, h))\n",
"\n",
"# here \"model\" is your model's prediction (classification) function\n",
"Z = tn_model.predict(np.c_[xx.ravel(), yy.ravel()])\n",
"\n",
"# Put the result into a color plot\n",
"Z = Z.reshape(xx.shape)\n",
"plt.contourf(xx, yy, Z)\n",
"plt.axis('off')\n",
"\n",
"# Plot also the training points\n",
"plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)"
],
"execution_count": 41,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"5/5 [==============================] - 0s 7ms/step\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fa51010ceb0>"
]
},
"metadata": {},
"execution_count": 41
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
],
"image/png": "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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"seconds = time.time()\n",
"print(\"Time in seconds since end of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "s_ukr55OORqE",
"outputId": "271d17c8-8b72-452a-95e7-6f97933c8308"
},
"execution_count": 42,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since end of run: 1712723689.0000172\n",
"Wed Apr 10 04:34:49 2024\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"seconds = time.time()\n",
"print(\"Time in seconds since beginning of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "o8HTyvcHchzQ",
"outputId": "397c7fb6-dda6-4a20-8b44-0ebd455ca778"
},
"execution_count": 43,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since beginning of run: 1712723689.0060678\n",
"Wed Apr 10 04:34:49 2024\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"# Function to compute saliency map\n",
"@tf.function\n",
"def compute_saliency(input_image):\n",
" with tf.GradientTape() as tape:\n",
" tape.watch(input_image)\n",
" predictions = tn_model(input_image)\n",
" grads = tape.gradient(predictions, input_image)\n",
" saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
" return saliency_map\n",
"\n",
"# Function to compute saliency map using Gradient\n",
"@tf.function\n",
"def compute_gradient_saliency(input_image):\n",
" with tf.GradientTape() as tape:\n",
" tape.watch(input_image)\n",
" predictions = tn_model(input_image)\n",
" grads = tape.gradient(predictions, input_image)\n",
" saliency_map = tf.reduce_max(tf.abs(grads), axis=-1)\n",
" return saliency_map\n",
"\n",
"# Compute saliency map for the entire grid\n",
"def compute_saliency_map_grid():\n",
" xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))\n",
" input_image = np.c_[xx.ravel(), yy.ravel()]\n",
" saliency_map = compute_saliency(tf.constant(input_image, dtype=tf.float32)).numpy()\n",
" saliency_map = saliency_map.reshape(xx.shape)\n",
" return xx, yy, saliency_map\n",
"\n",
"# Compute and plot saliency map for the entire grid\n",
"xx, yy, saliency_map = compute_saliency_map_grid()\n",
"\n",
"# Compute saliency maps for all data points\n",
"def compute_saliency_maps():\n",
" saliency_maps = []\n",
" for data_point in X:\n",
" saliency_map = compute_gradient_saliency(tf.constant(data_point[None, :], dtype=tf.float32)).numpy()\n",
" saliency_maps.append(saliency_map)\n",
" return saliency_maps\n",
"\n",
"# Find the indices of the data points with the highest saliency values\n",
"def find_top_indices(saliency_maps, top_k):\n",
" top_indices = np.argsort(np.max(saliency_maps, axis=1))[-top_k:]\n",
" return top_indices\n",
"\n",
"def plot_most_diagnostic(top_indices, top_k, normalized_saliency_values):\n",
" plt.figure(figsize=(8, 6))\n",
" plt.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)\n",
" plt.scatter(X[top_indices, 0], X[top_indices, 1], marker='o', s=200, facecolors='none', edgecolors='r', linewidths=2)\n",
" for i, index in enumerate(top_indices):\n",
" plt.annotate(f'{normalized_saliency_values.iloc[index][\"Saliency\"]:.4f}', (X[index, 0], X[index, 1]), xytext=(X[index, 0]+0.35, X[index, 1]+0.25), arrowprops=dict(facecolor='black', arrowstyle='->'))\n",
" plt.title(f'Saliency Most Diagnostic Data Points (Top {top_k})')\n",
" plt.xlabel('Feature 1')\n",
" plt.ylabel('Feature 2')\n",
" plt.grid(True)\n",
" plt.axis('equal')\n",
" plt.show()\n",
"\n",
"# Compute saliency maps for all data points\n",
"saliency_maps = compute_saliency_maps()\n",
"\n",
"# Find the indices of the data points with the highest saliency values\n",
"top_k = 5 # Number of top diagnostic data points to select\n",
"top_indices = find_top_indices(saliency_maps, top_k)\n",
"\n",
"# Create a DataFrame to store the saliency values\n",
"saliency_df = pd.DataFrame(data=saliency_maps, columns=[\"Saliency\"])\n",
"\n",
"# Save the saliency values to a CSV file\n",
"saliency_df.to_csv(\"saliency_values.csv\", index=False)\n",
"\n",
"print(\"Saliency values saved to saliency_values.csv\")\n",
"\n",
"# Normalizing the saliency values\n",
"normalized_saliency = (saliency_df - saliency_df.min()) / (saliency_df.max() - saliency_df.min())\n",
"\n",
"# Saving the normalized saliency values to a new CSV file\n",
"normalized_saliency.to_csv(\"normalized_saliency_values.csv\", index=False)\n",
"\n",
"# Plot the most diagnostic data points\n",
"plot_most_diagnostic(top_indices, top_k, normalized_saliency)\n",
"\n",
"print(\"Normalized saliency values saved to normalized_saliency_values.csv\")\n",
"print(\"Normalized Saliency Top-k:\")\n",
"print(normalized_saliency.nlargest(top_k, 'Saliency'))\n",
"print(\"Normalized Saliency Max:\", normalized_saliency.max())\n",
"print(\"Normalized Saliency Min:\", normalized_saliency.min())\n",
"print(\"Normalized Saliency Mean:\", normalized_saliency.mean())\n",
"print(\"Normalized Saliency Median:\", normalized_saliency.median())\n",
"print(\"Normalized Saliency Mode:\", normalized_saliency.mode())\n",
"sum_normalized_values = normalized_saliency.sum()\n",
"print(\"Normalized Saliency Sum:\", sum_normalized_values)\n",
"print(\"#\")\n",
"print(\"#\")\n",
"print(\"#\")\n",
"print(\"Normalized Saliency Standard Deviation:\", normalized_saliency.std())\n",
"print(\"Normalized Saliency Skewness:\", normalized_saliency.skew())\n",
"print(\"Normalized Saliency Kurtosis:\", normalized_saliency.kurtosis())\n",
"print(\"Normalized Saliency Variance:\", normalized_saliency.var())\n",
"coefficient_variation = (normalized_saliency.std() / normalized_saliency.mean()) * 100\n",
"print(\"Normalized Saliency Coefficient of Variation:\", coefficient_variation)\n",
"print(\"#\")\n",
"print(\"#\")\n",
"print(\"#\")\n",
"cumulative_sum = normalized_saliency.cumsum()\n",
"print(\"Cumulative Sum of Normalized Saliency Values:\", cumulative_sum)\n",
"mean_cumulative_sum = cumulative_sum / len(normalized_saliency)\n",
"print(\"Mean of Cumulative Sum of Normalized Saliency Values:\", mean_cumulative_sum)\n",
"rms = np.sqrt(np.mean(normalized_saliency**2))\n",
"print(\"Normalized Saliency Root Mean Square:\", rms)\n",
"q1 = normalized_saliency.quantile(0.25)\n",
"q2 = normalized_saliency.quantile(0.75)\n",
"iqr = q2 - q1\n",
"print(\"Normalized Saliency 25th Percentile:\", q1)\n",
"print(\"Normalized Saliency 75th Percentile:\", q2)\n",
"print(\"Normalized Saliency Interquartile Range:\", iqr)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 1843
},
"id": "95xed6YyDClf",
"outputId": "de0b400e-8480-46d5-bf1c-82d9536be83c"
},
"execution_count": 44,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Saliency values saved to saliency_values.csv\n"
]
},
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 800x600 with 1 Axes>"
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAscAAAIjCAYAAADvI7a6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADKNklEQVR4nOzdd3hUVfrA8e+dkpn0XkmAQEBAqjRBEVSaura1YwHsvbCuigVEVrEi/sTFVdeCDVd0rYgCgquANJFeQ+jpPZlk6v39ETISSTJ3wkySSd7P8/CQ3Dn3zjtzp7w595z3KKqqqgghhBBCCCHQtXQAQgghhBBCtBaSHAshhBBCCHGMJMdCCCGEEEIcI8mxEEIIIYQQx0hyLIQQQgghxDGSHAshhBBCCHGMJMdCCCGEEEIcI8mxEEIIIYQQx0hyLIQQQgghxDGSHAvRyowaNYpRo0a5f9+/fz+KovDuu++2WExCu0mTJtG5c+eWDqNZPfnkkyiK0tJhtBmKovDkk0+2dBh1PP/88/To0QOXy9XSoTTJ4sWLCQsLIz8/v6VDEQFAkmMhTtKWLVu4/PLL6dSpE2azmQ4dOjBmzBheffXVlg6tValNoHQ6HYcOHTrh9rKyMoKDg1EUhbvvvtsvMWzfvp0nn3yS/fv3a2pfG3Ptv5CQEDp27MiFF17IO++8g9Vq9UucrZHFYuHJJ59kxYoVfr0ffz7nixYt8kvSOWnSpDoxR0RE0K9fP1566aVmf40888wzfPHFFz49ZllZGc899xwPP/wwOp3uhMfb0L9Jkyb5NI76NBRLjx496rQbP348GRkZzJo1y+8xicBnaOkAhAhkq1at4uyzz6Zjx47ccsstJCUlcejQIX799VdeeeUV7rnnnpO+j06dOlFVVYXRaPRBxC3PZDLx8ccf89BDD9XZ/vnnn/v9vrdv386MGTMYNWqUV7278+bNIywsDKvVypEjR/j++++58cYbmTNnDt988w1paWnutm+++WbA9q41xmKxMGPGDIA6VzYAHn/8cR555BGf3p83z7lWixYt4rXXXvNLgmwymXjrrbcAKCkp4bPPPuPBBx9k3bp1LFiwwKtjVVVVYTA07ev5mWee4fLLL+eSSy5p0v71efvtt3E4HFxzzTUA3HbbbYwePdp9e1ZWFtOmTePWW29lxIgR7u1du3b1WQyNOf65rxUZGXlCu9tuu40HH3yQGTNmEB4e3iyxicAkybEQJ+Hpp58mMjKSdevWERUVVee2vLw8n9yHoiiYzWafHKs1OP/88+tNjj/66CMuuOACPvvssxaKrGGXX345cXFx7t+nTZvGhx9+yA033MAVV1zBr7/+6r6trfwR4w2DwdDkZK4h3jznrYHBYOC6665z/37nnXcydOhQPvnkE2bPnk1KSormY7W29/s777zDRRdd5I5r2LBhDBs2zH37+vXrmTZtGsOGDavzHDSXPz/3Dbnsssu45557+PTTT7nxxhubITIRqGRYhRAnITMzk1NPPfWExBggISGhzu/vvPMO55xzDgkJCZhMJnr16sW8efM83kdDY4537tzJ5ZdfTkxMDGazmUGDBvHVV1/VafPuu++iKAorV65kypQpxMfHExoayqWXXlrv2LvvvvuOkSNHEh4eTkREBIMHD+ajjz4CYPr06RiNxnr3u/XWW4mKiqK6utrj45kwYQK///47O3fudG/Lycnhxx9/ZMKECfXuk5eXx0033URiYiJms5l+/frx3nvvndBuwYIFDBw40B1/nz59eOWVV9zPxRVXXAHA2Wef7b782tRhAtdeey0333wza9asYcmSJe7t9Y05fvHFFxk+fDixsbEEBwczcOBAFi5ceMIxq6qquPfee4mLiyM8PJyLLrqII0eOnDAGtXbowd69e5k0aRJRUVFERkYyefJkLBZLnWM6HA5mzpxJ165dMZlMdO7cmUcfffSEy/3r169n3LhxxMXFERwcTHp6ujuB2L9/P/Hx8QDMmDHD/dzVxtTQmOMPPviAIUOGEBISQnR0NGeddRY//PCD5uf4zxp6zn/++WeuuOIKOnbsiMlkIi0tjQceeICqqip3m0mTJvHaa68B1Ln8XkvrOdJKp9O5e9hrh/FofR039XwrikJlZSXvvffeCUMbysvLuf/+++ncuTMmk4mEhATGjBnDb7/91ujjyMrKYvPmzXV6irX69NNPGThwIMHBwcTFxXHddddx5MiROm0mTZpEWFgY+/btY9y4cYSGhpKSksJTTz2Fqqqa78vpdFJWVtZom4SEBPr27cuXX37p9WMR7Yskx0KchE6dOrFhwwa2bt3qse28efPo1KkTjz76KC+99BJpaWnceeed7i9sb2zbto3TTz+dHTt28Mgjj/DSSy8RGhrKJZdcwn//+98T2t9zzz1s2rSJ6dOnc8cdd/D111+fMK733Xff5YILLqCoqIipU6fy7LPP0r9/fxYvXgzA9ddfj8Ph4JNPPqmzn81mY+HChVx22WWaerzOOussUlNT3Uk3wCeffEJYWBgXXHDBCe2rqqoYNWoU77//Ptdeey0vvPACkZGRTJo0yZ34AixZsoRrrrmG6OhonnvuOZ599llGjRrFypUr3fd77733AvDoo4/y/vvv8/7779OzZ0+PMTfk+uuvB/CY8L3yyisMGDCAp556imeeeQaDwcAVV1zBt99+W6fdpEmTePXVVzn//PN57rnnCA4Orvc5qXXllVdSXl7OrFmzuPLKK3n33XfdQx9q3XzzzUybNo3TTjuNl19+mZEjRzJr1iyuvvpqd5u8vDzGjh3L/v37eeSRR3j11Ve59tpr3b2z8fHx7j/kLr30Uvdz99e//rXB2GbMmMH111+P0WjkqaeeYsaMGaSlpfHjjz82+lx5Ut9z/umnn2KxWLjjjjt49dVXGTduHK+++io33HCDu81tt93GmDFjANzxv//+++7btZ4jb2RmZgIQGxur+XXcGE/n+/3338dkMjFixAj347vtttsAuP3225k3bx6XXXYZ//znP3nwwQcJDg5mx44djd7nqlWrADjttNO8euzvvvsuV155JXq9nlmzZnHLLbfw+eefc+aZZ1JSUlKnrdPpZPz48SQmJvL8888zcOBApk+fzvTp0zXdl8ViISIigsjISGJiYrjrrruoqKiot+3AgQPdj0mIBqlCiCb74YcfVL1er+r1enXYsGHqQw89pH7//feqzWY7oa3FYjlh27hx49QuXbrU2TZy5Eh15MiR7t+zsrJUQH3nnXfc284991y1T58+anV1tXuby+VShw8frnbr1s297Z133lEBdfTo0arL5XJvf+CBB1S9Xq+WlJSoqqqqJSUlanh4uDp06FC1qqqqTjzH7zds2DB16NChdW7//PPPVUBdvnx5Pc/QH6ZPn64Can5+vvrggw+qGRkZ7tsGDx6sTp48WVVVVQXUu+66y33bnDlzVED94IMP3NtsNps6bNgwNSwsTC0rK1NVVVXvu+8+NSIiQnU4HA3G8Omnn2qKtb6Y61NcXKwC6qWXXureNnHiRLVTp0512v353NtsNrV3797qOeec4962YcMGFVDvv//+Om0nTZqkAur06dNPiOvGG2+s0/bSSy9VY2Nj3b///vvvKqDefPPNddo9+OCDKqD++OOPqqqq6n//+18VUNetW9fAM6Gq+fn5J8Tx53hq7dmzR9XpdOqll16qOp3OOm2Pfz3VpynPeX3vrVmzZqmKoqgHDhxwb7vrrrvUhr72tJyjhkycOFENDQ1V8/Pz1fz8fHXv3r3qM888oyqKovbt21dVVe2vY1VVm3y+VVVVQ0ND1YkTJ54QY2RkZJ33lVaPP/64Cqjl5eUNtlm3bl2dzyibzaYmJCSovXv3rvN58s0336iAOm3aNPe2iRMnqoB6zz33uLe5XC71ggsuUIOCghp8HdR65JFH1Icfflj95JNP1I8//th9vDPOOEO12+0ntH/mmWdUQM3NzdX6FIh2SHqOhTgJY8aMYfXq1Vx00UVs2rSJ559/nnHjxtGhQ4cThjgEBwe7fy4tLaWgoICRI0eyb98+SktLNd9nUVERP/74o7sXqaCggIKCAgoLCxk3bhx79uw54dLlrbfeWucS8ogRI3A6nRw4cACo6XUtLy/nkUceOaH39/j9brjhBtasWePuEQP48MMPSUtLY+TIkZofw4QJE9i7dy/r1q1z/9/QkIpFixaRlJTkngwENeN67733XioqKvjpp58AiIqKorKyss7ldn8LCwsDai5ZN+b4c19cXExpaSkjRoyoc0m7tof+zjvvrLNvY5M6b7/99jq/jxgxgsLCQvfl5UWLFgEwZcqUOu3+9re/Abh7RWuHBX3zzTfY7fZGH4sWX3zxBS6Xi2nTpqHT1f2aOdmSb/U958c/v5WVlRQUFDB8+HBUVWXjxo2ajqvlHDWmsrKS+Ph44uPjycjI4NFHH2XYsGHuKzlaX8eN8XS+GxMVFcWaNWs4evSopsdTq7CwEIPB4H7etVi/fj15eXnceeeddT5PLrjgAnr06FFvb/zxV7JqK9bYbDaWLl3a6H3NmjWLZ599liuvvJKrr76ad999l6effpqVK1fWOywmOjoagIKCAs2PR7Q/khwLcZIGDx7M559/TnFxMWvXrmXq1KmUl5dz+eWXs337dne7lStXMnr0aEJDQ4mKiiI+Pp5HH30UwKvkeO/evaiqyhNPPOH+Mq79V3sZ8s+TATt27Fjn99oviOLiYuCPy7+9e/du9L6vuuoqTCYTH374oTvub775hmuvvdarpGfAgAH06NGDjz76iA8//JCkpCTOOeecetseOHCAbt26nZBk1Q6HqE3w77zzTrp37855551HamoqN954ozvh9JfaS7eeZr5/8803nH766ZjNZmJiYtzDFI4/7wcOHECn05Genl5n34yMjAaP6+m81h7zz8dISkoiKirK/dyNHDmSyy67jBkzZhAXF8fFF198UmXTMjMz0el09OrVq0n7N6a+5/zgwYNMmjSJmJgYwsLCiI+Pd/+xpvW9peUcNcZsNrNkyRKWLFnC//73Pw4dOsTKlSvp0qULoP113BhP57sxzz//PFu3biUtLY0hQ4bw5JNPsm/fPk2PzVu1j+WUU0454bYePXqc8Fh1Op37earVvXt3AM1lF4/3wAMPoNPp6k2s1WPjmKUut2iMJMdC+EhQUBCDBw/mmWeeYd68edjtdj799FOgJlk499xzKSgoYPbs2Xz77bcsWbKEBx54AMCr0l+1bR988EH3l/Gf//05GdLr9fUeS/ViwgvUfBn/5S9/cSfHCxcuxGq1NmmG+oQJE/jkk0/46KOPuOqqq05IGryVkJDA77//zldffcVFF13E8uXLOe+885g4ceJJHbcxtWPNG0tgf/75Z/dM/3/+858sWrSIJUuWMGHCBK+f/z/Tel49JQKKorBw4UJWr17N3XffzZEjR7jxxhsZOHBgg2M3W8qfn3On08mYMWP49ttvefjhh/niiy9YsmSJewKrlveWL86RXq9n9OjRjB49mhEjRpCamtq0B+jhPuqjJcYrr7ySffv28eqrr5KSksILL7zAqaeeynfffdfofrGxsTgcDo9XR1qT4OBgYmNjKSoqOuG22j8kjq+EIsSfSSk3Ifxg0KBBAGRnZwPw9ddfY7Va+eqrr+r0/ixfvtzrY9f2sBiNxibNIK9PbT3SrVu3NproQc3Qiosvvph169bx4YcfMmDAAE499VSv73PChAlMmzaN7OzsOhOj/qxTp05s3rwZl8tVJ4GurXbRqVMn97agoCAuvPBCLrzwQlwuF3feeSf/+te/eOKJJ8jIyPB5b1Ft3OPGjWuwzWeffYbZbOb777/HZDK5t7/zzjt12nXq1AmXy0VWVhbdunVzb9+7d2+T46s95p49e+pMPMzNzaWkpKTOcwdw+umnc/rpp/P000/z0Ucfce2117JgwQJuvvlmr567rl274nK52L59O/37929y/PX583O+ZcsWdu/ezXvvvVdnAl59w2saegxaz9HJ8OZ1fDIaO0/Jycnceeed3HnnneTl5XHaaafx9NNPc9555zW4T+1iGllZWfTt21dTDLWPZdeuXSdcEdq1a9cJj9XlcrFv3z53bzHA7t27AZq02mTtcLPaCivHy8rKIi4urt7bhKglPcdCnITly5fX22tTO9az9rJibY/P8W1LS0ub9OWbkJDAqFGj+Ne//uVOvo/XlOVRx44dS3h4OLNmzTqhHNufH995551HXFwczz33HD/99FOT65p27dqVOXPmMGvWLIYMGdJgu/PPP5+cnJw6VTIcDgevvvoqYWFh7svnhYWFdfbT6XTuL/Pa4QGhoaEAJ8yWb4qPPvqIt956i2HDhnHuuec22E6v16MoCk6n071t//79J6xiVpvs/fOf/6yz/WRWWjz//PMBmDNnTp3ts2fPBnBXwiguLj7hPNcmtbXPXUhICKDtubvkkkvQ6XQ89dRTJ/TcnkxveX3PeX3vLVVV660A0dD513qOTobW1/HJCg0NrbcaxJ+HhyQkJJCSkuJx6ExtPeP169drjmHQoEEkJCTw+uuv1zn+d999x44dO+qtwDJ37lz3z6qqMnfuXIxGY6Pvrerq6np7tGfOnImqqowfP/6E2zZs2FCnRrMQ9ZGeYyFOwj333IPFYuHSSy+lR48e2Gw2Vq1axSeffELnzp2ZPHkyUJN81vZq3nbbbVRUVPDmm2+SkJBQb4LryWuvvcaZZ55Jnz59uOWWW+jSpQu5ubmsXr2aw4cPs2nTJq+OFxERwcsvv8zNN9/M4MGDmTBhAtHR0WzatAmLxVKnFqvRaOTqq69m7ty56PX6OhOMvHXfffd5bHPrrbfyr3/9i0mTJrFhwwY6d+7MwoULWblyJXPmzHGPPb355pspKirinHPOITU1lQMHDvDqq6/Sv39/d69p//790ev1PPfcc5SWlmIymdy1pxuzcOFCwsLCsNls7tXaVq5cSb9+/dxDZxpywQUXMHv2bMaPH8+ECRPIy8vjtddeIyMjg82bN7vbDRw4kMsuu4w5c+ZQWFjI6aefzk8//eTuQWtKr3e/fv2YOHEib7zxBiUlJYwcOZK1a9fy3nvvcckll3D22WcD8N577/HPf/6TSy+9lK5du1JeXs6bb75JRESEO8EODg6mV69efPLJJ3Tv3p2YmBh69+5d7zj1jIwMHnvsMWbOnMmIESP461//islkYt26daSkpGhawlfrc96jRw+6du3Kgw8+yJEjR4iIiOCzzz6rdxzuwIEDAbj33nsZN24cer2eq6++WvM5OhlaX8cna+DAgSxdutS98Eh6ejqnnHIKqampXH755fTr14+wsDCWLl3KunXreOmllxo9XpcuXejduzdLly7VvHCG0WjkueeeY/LkyYwcOZJrrrmG3NxcXnnlFTp37uweTlbLbDazePFiJk6cyNChQ/nuu+/49ttvefTRRxvt4c3JyWHAgAFcc8017h7u77//nkWLFjF+/HguvvjiOu3z8vLYvHkzd911l6bHIdqxZq+PIUQb8t1336k33nij2qNHDzUsLEwNCgpSMzIy1HvuueeEUkFfffWV2rdvX9VsNqudO3dWn3vuOfXtt99WATUrK8vdTkspN1VV1czMTPWGG25Qk5KSVKPRqHbo0EH9y1/+oi5cuNDdpraU259LdC1fvrzekmZfffWVOnz4cDU4OFiNiIhQhwwZon788ccnPO61a9eqgDp27FjNz5WnEl21+FMpN1VV1dzcXHXy5MlqXFycGhQUpPbp0+eE52PhwoXq2LFj1YSEBDUoKEjt2LGjetttt6nZ2dl12r355ptqly5dVL1e77GsW23Mtf/MZrOampqq/uUvf1HffvvtOqX0atVXyu3f//632q1bN9VkMqk9evRQ33nnnRPKn6mqqlZWVqp33XWXGhMTo4aFhamXXHKJumvXLhVQn3322RPi+vNzWXu+j3892e12dcaMGWp6erpqNBrVtLQ0derUqXVi/+2339RrrrlG7dixo2oymdSEhAT1L3/5i7p+/fo6x1+1apU6cOBANSgoqE65sfoei6qq6ttvv60OGDBANZlManR0tDpy5Eh1yZIlDT7fTX3Ot2/fro4ePVoNCwtT4+Li1FtuuUXdtGnTCe8bh8Oh3nPPPWp8fLyqKEqdmLWeo/rUlnLzRMvrWFUbLuWm5Xzv3LlTPeuss9Tg4GAVUCdOnKharVb173//u9qvXz81PDxcDQ0NVfv166f+85//9Bizqqrq7Nmz1bCwsHpL5qnqiaXcan3yySfu8x8TE6Nee+216uHDh+u0qX3uMjMz1bFjx6ohISFqYmKiOn369BPKAP5ZcXGxet1116kZGRlqSEiIajKZ1FNPPVV95pln6i2nOW/ePDUkJKRO2Twh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jtfW1mLZsmUtRm6baTQanDhxAldffTXuuusuPPXUUwgJCcHWrVtx++23w2KxtJkcC4IAURRbHGttwV1zot4cDwC89dZbSEtLa9GueY40EZE3YHJMROSFRo4ciSNHjrSaOANAdnY2HA4HVq5cCZmsce31J5980qKNSqWC3W4/79zw8HAUFhY6bx87dgwmk6nNeCIjIxEdHY3jx49j5syZHX06REQeg8kxEZEXWrJkCa6++mrExsbi//7v/yCTybB3714cOHAATz75JBITE2G1WvHqq69i2rRp2LZtG1avXt3iGnFxcaitrcXGjRsxfPhw6HQ66HQ6TJo0Ca+99hrGjRsHu92Ohx56CEqlst2Yli1bhr/85S8ICgpCRkYGzGYzdu7cicrKSixcuLDVc2pra1vs25yfn489e/YgJCQEsbGxXftPIiLqBG7lRkTkhdLT0/HNN99g/fr1GDNmDC666CL87W9/Q79+/QAAw4cPx4svvohnn30WQ4cOxdq1a/H000+3uMb48eNx55134vrrr0d4eDiee+45AMDKlSsRExOD3/3ud7jpppvwwAMPSJqjfMcdd+Dtt9/Ge++9h5SUFEycOBFr1qxpc1/mnTt3IjU1FampqQCAhQsXIjU1FUuWLOnsfw0RUZcI4m8nlhERERER9VIcOSYiIiIiasLkmIiIiIioCZNjIiIiIqImTI6JiIiIiJowOSYiIiIiasLkmIiIiIioCZNjIiIiIqImTI6JiIiIiJowOSYiIiIiasLkmIiIiIioCZNjIiIiIqIm/w+Vb5T3dD2kLQAAAABJRU5ErkJggg==\n"
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Normalized saliency values saved to normalized_saliency_values.csv\n",
"Normalized Saliency Top-k:\n",
" Saliency\n",
"239 1.000000\n",
"240 0.915025\n",
"241 0.225533\n",
"242 0.011494\n",
"337 0.009320\n",
"Normalized Saliency Max: Saliency 1.0\n",
"dtype: float32\n",
"Normalized Saliency Min: Saliency 0.0\n",
"dtype: float32\n",
"Normalized Saliency Mean: Saliency 0.00554\n",
"dtype: float32\n",
"Normalized Saliency Median: Saliency 0.000581\n",
"dtype: float32\n",
"Normalized Saliency Mode: Saliency\n",
"0 5.227195e-07\n",
"Normalized Saliency Sum: Saliency 2.659034\n",
"dtype: float32\n",
"#\n",
"#\n",
"#\n",
"Normalized Saliency Standard Deviation: Saliency 0.062563\n",
"dtype: float32\n",
"Normalized Saliency Skewness: Saliency 14.950437\n",
"dtype: float32\n",
"Normalized Saliency Kurtosis: Saliency 226.663666\n",
"dtype: float32\n",
"Normalized Saliency Variance: Saliency 0.003914\n",
"dtype: float32\n",
"Normalized Saliency Coefficient of Variation: Saliency 1129.371094\n",
"dtype: float32\n",
"#\n",
"#\n",
"#\n",
"Cumulative Sum of Normalized Saliency Values: Saliency\n",
"0 5.227195e-07\n",
"1 1.045439e-06\n",
"2 1.568158e-06\n",
"3 2.090878e-06\n",
"4 2.613597e-06\n",
".. ...\n",
"475 2.649243e+00\n",
"476 2.650992e+00\n",
"477 2.652752e+00\n",
"478 2.653316e+00\n",
"479 2.659033e+00\n",
"\n",
"[480 rows x 1 columns]\n",
"Mean of Cumulative Sum of Normalized Saliency Values: Saliency\n",
"0 1.088999e-09\n",
"1 2.177998e-09\n",
"2 3.266997e-09\n",
"3 4.355996e-09\n",
"4 5.444994e-09\n",
".. ...\n",
"475 5.519256e-03\n",
"476 5.522900e-03\n",
"477 5.526566e-03\n",
"478 5.527741e-03\n",
"479 5.539653e-03\n",
"\n",
"[480 rows x 1 columns]\n",
"Normalized Saliency Root Mean Square: 0.06274309\n",
"Normalized Saliency 25th Percentile: Saliency 0.000287\n",
"Name: 0.25, dtype: float64\n",
"Normalized Saliency 75th Percentile: Saliency 0.001358\n",
"Name: 0.75, dtype: float64\n",
"Normalized Saliency Interquartile Range: Saliency 0.001071\n",
"dtype: float64\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"seconds = time.time()\n",
"print(\"Time in seconds since end of run:\", seconds)\n",
"local_time = time.ctime(seconds)\n",
"print(local_time)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 0
},
"id": "wfZCzuq9KY9b",
"outputId": "bce6ab86-5014-4cd1-844f-137ec0108709"
},
"execution_count": 45,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Time in seconds since end of run: 1712723690.9435394\n",
"Wed Apr 10 04:34:50 2024\n"
]
}
]
}
]
}